/*
*   Grupo 2:		Ana Elisa Siena			7126563
*                       Larissa Zimmermann		7126879
* 
*   Jogo em Java - AngryBirds
*   SCC - 604 - Programação Orientada a Objetos
*   Prof. Fernando V. Paulovich
*   Engenharia de Computação 010 - USP - São Carlos
*   Segundo Semestre de 2011 
*	
*/

package angrybirds.fases;

import angrybirds.jogador.JogadorInfo;
import angrybirds.main.Angrybirds;
import angrybirds.personagens.Fumacinha;
import angrybirds.personagens.Passaro;
import angrybirds.personagens.Porco;
import org.newdawn.slick.Animation;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.Music;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;
import org.newdawn.slick.SpriteSheet;
import org.newdawn.slick.geom.Circle;
import org.newdawn.slick.geom.Vector2f;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public abstract class FaseGeral extends BasicGameState {

    private Image ceu = null;
    private Image voltarMenu = null;
    private Image voltarJogo = null;
    private Image chao = null;
    private float voltarMenuEscala = 1;
    private float voltarJogoEscala = 1;
    private Sound musicaOpcao = null;
    private Music musicaFundo = null;
    private Sound porcoAparecendo = null;
    private Sound colidiu = null;
    protected Sound passaroAparecendo = null;
    private float points[] = new float[12];
    private int num_porcos = 0;
    private int num_passaros = 0;
    private Porco[] Anima_Porco = null;
    public Passaro Anima_Passaro = null;
    public Fumacinha Anima_Fumacinha = null;
    private Vector2f posicao_passaro = new Vector2f();
    private Vector2f posicao_porco = new Vector2f();
    public Vector2f position_fumacinha = new Vector2f();
    private int count;
    private int rapidez_porco = 0;
    private JogadorInfo player;
    private int pontuacaoJogador = 0;
    private boolean colisao = false;
    private StateBasedGame sBGame;
    
    private int PONTOS;

    public int getPONTOS() {
        return PONTOS;
    }

    public void setPONTOS(int PONTOS) {
        this.PONTOS = PONTOS;
    }
   
    public StateBasedGame getsBGame() {
        return sBGame;
    }

    public void setsBGame(StateBasedGame sBGame) {
        this.sBGame = sBGame;
    }

    public void setPontuacaoJogador(int pontuacaoJogador) {
        this.pontuacaoJogador = pontuacaoJogador;
    }

    public JogadorInfo getPlayer() {
        return player;
    }

    public int getNum_porcos() {
        return num_porcos;
    }

    public Music getMusicaFundo() {
        return musicaFundo;
    }

    public Porco[] getAnima_Porco() {
        return Anima_Porco;
    }

    public void setNum_porcos(int num_porcos) {
        this.num_porcos = num_porcos;
    }

    public int getNum_passaros() {
        return num_passaros;
    }

    public void setNum_passaros(int num_passaros) {
        this.num_passaros = num_passaros;
    }

    public Vector2f getPosicaoPassaro() {
        return posicao_passaro;
    }

    public void setPosicaoPassaro(Vector2f position) {
        this.posicao_passaro = position;
    }

    public Sound getPorcoAparecendo() {
        return porcoAparecendo;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public void setRapidez_porco(int rapidez_porco) {
        this.rapidez_porco = rapidez_porco;
    }

    public FaseGeral() {
//        this.player.addScore(0);
        this.colisao = false;
        this.num_porcos = 0;
        this.num_passaros = 0;

        this.posicao_passaro = new Vector2f(350, 500);
    }

    @Override
    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {

        Anima_Porco = new Porco[num_porcos];

        this.ceu = new Image("imagensJogo/FundoJogo.jpg");
        this.chao = new Image("imagensJogo/ChaoFases.png");
        this.voltarMenu = new Image("imagensJogo/Botao_Voltar_Menu.png");
        this.voltarJogo = new Image("imagensJogo/Botao_Recomecar.png");

        this.posicao_porco.set(100, 100);//POSIÇÃO DO PORCO

        musicaOpcao = new Sound("sons/SelecaoBotoes.wav");
        musicaFundo = new Music("sons/FaseFundo.wav");
        porcoAparecendo = new Sound("sons/PorcoAparecendo.wav");
        colidiu = new Sound("sons/Colisao.wav");

        //PORQUINHO
        SpriteSheet Porco = new SpriteSheet("imagensJogo/PorcoMenor.png", 50, 50);
        Animation porco = new Animation(true);

        for (int j = 0; j < Anima_Porco.length; j++) {

            this.Anima_Porco[j] = new Porco(null, porco, Porco, this.posicao_porco, 2,
                    new Circle(this.posicao_porco.x + 25, this.posicao_porco.y + 25, 25), 0);
            this.Anima_Porco[j].setVida_porco(1);
            this.Anima_Porco[j].renderizar();
        }

        //Fumaca
        SpriteSheet Fumacinha = new SpriteSheet("imagensJogo/Fumaca.png", 100, 100);
        Animation fumacinha = new Animation(true);
        this.Anima_Fumacinha = new Fumacinha(null, fumacinha, Fumacinha, this.position_fumacinha, 2,
                new Circle(this.position_fumacinha.x + 25, this.position_fumacinha.y + 25, 25), 0);
        this.Anima_Fumacinha.renderizar();

        this.count = 0;

        this.player = new JogadorInfo(this.num_passaros);
        this.player.setScore(this.pontuacaoJogador);
    }

    @Override
    public void render(GameContainer gc, StateBasedGame sbg, Graphics grphcs) throws SlickException {

        this.ceu.draw(0, 0);

        this.chao.draw(0, 508);

        this.voltarMenu.draw(0, 0, this.voltarMenuEscala);

        this.voltarJogo.draw(100, 0, this.voltarJogoEscala);

        count++;
        if (count % rapidez_porco == 0) {
            for (int i = 0; i < Anima_Porco.length; i++) {
                if (this.Anima_Porco[i].getVida_porco() == 1 && num_passaros != 0) {
                    this.Anima_Porco[i].setPosition(this.Anima_Porco[i].Aleatorio());
                    porcoAparecendo.play();
                }
            }
        }

        for (int i = 0; i < Anima_Porco.length; i++) {
            if (this.Anima_Porco[i].getVida_porco() == 1) {
                this.Anima_Porco[i].render(grphcs);
            }
//            else  this.Anima_Fumacinha.render(grphcs);
        }

//        this.Anima_Fumacinha.render(grphcs);

        if (this.colisao) {
            System.out.println("Colidiu!!-.-");
            this.Anima_Fumacinha.render(grphcs);
            this.Anima_Fumacinha.setFumacinha_vida(0);
        }

        grphcs.drawString("Pontuação: " + this.player.getScore(), 500, 10);
        grphcs.drawString("Vida: " + this.num_passaros, 700, 10);
        grphcs.setColor(org.newdawn.slick.Color.blue);
    }
    public float escala = 0.001f;

    @Override
    public void update(GameContainer gc, StateBasedGame sb, int delta) throws SlickException {

        Input input = gc.getInput();

        int mouseX = input.getMouseX();
        int mouseY = input.getMouseY();

        boolean insideBackmenu = false;
        boolean insidePlaygame = false;

        //Redimenciona Menu, Pause e Recomeçar
        if ((mouseX >= 0 && mouseX <= (this.voltarMenu.getWidth()))
                && (mouseY >= 0 && mouseY <= this.voltarMenu.getHeight())) {
            insideBackmenu = true;
        } else if ((mouseX >= this.voltarMenu.getWidth() && mouseX <= (this.voltarMenu.getWidth() + this.voltarJogo.getWidth())
                && (mouseY >= 0 && mouseY <= this.voltarJogo.getHeight()))) {
            insidePlaygame = true;
        }

        if (!musicaFundo.playing()) {
            musicaFundo.play();
        }

        if (insideBackmenu) {
            if (this.voltarMenuEscala < 1.05f) {
                this.voltarMenuEscala += this.escala * delta;
                musicaOpcao.play();
            }
            //se o click for realizado...
            if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) {
                sb.enterState(Angrybirds.MAINMENUSTATE);
                this.musicaFundo.stop();
            }
        } else {
            if (this.voltarMenuEscala > 1.0f) {
                this.voltarMenuEscala -= this.escala * delta;
            }
        }

        if (insidePlaygame) {
            if (this.voltarJogoEscala < 1.05f) {
                this.voltarJogoEscala += this.escala * delta;
                musicaOpcao.play();
            }
            //se o click for realizado...
            if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) {
                init(gc, this.sBGame);
                this.musicaFundo.stop();
            }
        } else {
            if (this.voltarJogoEscala > 1.0f) {
                this.voltarJogoEscala -= this.escala * delta;
            }
        }

        if (!insideBackmenu && !insidePlaygame) {
            if (Anima_Passaro.getVida_passaro() == 1) {
                this.Anima_Passaro.fly(input);
            } else {
                //se o passaro chegou no local do mouse e não colidiu
                if (this.getNum_passaros() != 0) {
                    Anima_Passaro.setPosition(new Vector2f(360, 500));
                    Anima_Passaro.setVida_passaro(1);
                    this.setNum_passaros(this.getNum_passaros() - 1);
                    this.player.setVida(this.getNum_passaros());
                    passaroAparecendo.play();
                }
            }
        }

        //se o passaro colidiu
        for (int i = 0; i < this.getAnima_Porco().length; i++) {
            if (this.getAnima_Porco()[i].getVida_porco() == 1) {
                if (this.Anima_Passaro.isCollidingWith(this.getAnima_Porco()[i])) {

                    this.getAnima_Porco()[i].setVida_porco(0);

                    this.Anima_Passaro.setVida_passaro(0);
                    this.Anima_Passaro.setClick(0);

                    this.position_fumacinha.set(this.Anima_Passaro.getPosition(posicao_porco));//POSIÇÃO DA FUMACINHA
                    this.Anima_Fumacinha.setFumacinha_vida(1);
                    this.colidiu.play();
                    this.player.addScore(100);

                    new Timer();
                }
//                else this.Anima_Fumacinha.setFumacinha_vida(0);
            }
        }
    }

    public class Timer extends Thread {

        public Timer() {
            this.start();
            colisao = true;
        }

        public void run() {
            while (colisao) {
                try {
                    colisao = true;
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                }
                colisao = false;
            }

        }
    }
}
